﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using WCFVeterinaria;

public partial class Clientes : System.Web.UI.Page
{
    #region Variables globales
    ServiceVeterinaria gestorVet = new ServiceVeterinaria();
    #endregion

    #region Evento para cargar la página
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["username"] == null)
        {
            Response.Redirect("/Login.aspx");
        }

        try
        {
            if (!IsPostBack)
            {
                ddlTipoIdentificacion.SelectedIndex = 1;
                obtenerClientes();
            }
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
        }


        if (!IsPostBack)
        {
            
        }
    }
    #endregion

    #region Evento Nuevo
    protected void btnNuevo_Click(object sender, EventArgs e)
    {
        ddlTipoIdentificacion.Enabled = true;
        txtIdentificacionID.Enabled = true;
        limpiar();
        ddlTipoIdentificacion.Focus();
    }
    #endregion

    #region Evento Agregar
    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        try
        {
            gestorVet.agregarCliente(txtIdentificacionID.Text, ddlTipoIdentificacion.SelectedValue.ToString(), 
                txtNombre.Text, txtApellidos.Text, txtTelHab.Text, txtTelCel.Text, txtEmail.Text, txtlDireccion.Text );
            obtenerClientes();
            limpiar();
            lblMensaje.Visible = true;
            lblMensaje.Text = "Registro insertado satisfactoriamente";
            lblMensaje.CssClass = "mensajeCorrecto";
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
        }
    }
    #endregion
    
    #region Evento Modificar
    protected void btnModificar_Click(object sender, EventArgs e)
    {
        try
        {
            gestorVet.actualizarCliente(txtIdentificacionID.Text, ddlTipoIdentificacion.SelectedValue.ToString(), 
                txtNombre.Text, txtApellidos.Text, txtTelHab.Text, txtTelCel.Text, txtEmail.Text, txtlDireccion.Text );
            obtenerClientes();
            lblMensaje.Visible = true;
            lblMensaje.Text = "Registro modificado satisfactoriamente";
            lblMensaje.CssClass = "mensajeCorrecto";
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
        }
    }
    #endregion

    #region Evento Eliminar
    protected void btnEliminar_Click(object sender, EventArgs e)
    {
        try
        {
            gestorVet.eliminarCliente(txtIdentificacionID.Text);
            obtenerClientes();
            limpiar();
            lblMensaje.Visible = true;
            lblMensaje.Text = "Registro eliminado satisfactoriamente";
            lblMensaje.CssClass = "mensajeCorrecto";
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
        }
    }
    #endregion

    #region Evento Consultar
    protected void btnConsultar_Click(object sender, EventArgs e)
    {
        try
        {
            WCFVeterinaria.Clientes cliente = gestorVet.consultarCliente(txtIdentificacionID.Text);
            if (cliente == null)
            {
                lblMensaje.Visible = true;
                lblMensaje.Text = "No existe el cliente con el ID " + txtIdentificacionID.Text;
                lblMensaje.CssClass = "mensajeError";
            }
            else
            {
                txtIdentificacionID.Text = cliente.IdentificacionID.ToString();
                ddlTipoIdentificacion.SelectedValue = cliente.TipoDeIdentificacion.ToString();
                txtNombre.Text = cliente.NombreORazonSocial.ToString();
                txtApellidos.Text = cliente.Apellidos.ToString();
                txtTelHab.Text = cliente.TelefonoHabitacion.ToString();
                txtTelCel.Text = cliente.TelefonoCelular.ToString();
                txtEmail.Text = cliente.Email.ToString();
                txtlDireccion.Text = cliente.Direccion.ToString();
            }
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
        }
    }
    #endregion

    #region Método para limpiar el texto
    private void limpiar()
    {
        ddlTipoIdentificacion.SelectedIndex = 1;
        txtIdentificacionID.Text = string.Empty;
        txtNombre.Text = string.Empty;
        txtApellidos.Text = string.Empty;
        txtTelHab.Text = string.Empty;
        txtTelCel.Text = string.Empty;
        txtEmail.Text = string.Empty;
        txtlDireccion.Text = string.Empty;
        lblMensaje.Text = string.Empty;
    }
    #endregion


    #region Métodos para manejar las columnas del grid
    /// <summary>
    /// Columnas del grid
    /// </summary>
    private enum Columnas
    {
        IdentificacionID,
        Tipo_de_identificacion,
        Nombre_o_razon_social,
        Apellidos,
        Telefono_habitacion,
        Telefono_celular,
        Email,
        Direccion
    }
    #endregion

    #region Método para obtener clientes
    protected void obtenerClientes()
    {
        try
        {
            DataTable tClientes = gestorVet.listarClientes();
            gvClientes.DataSource = tClientes;
            gvClientes.DataBind();

            //Session que se va a utilizar para la paginación
            Session["DsClientes"] = tClientes;
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
            throw;
        }
    }
    #endregion

    #region Evento cambio de página
    protected void gvClientes_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        try
        {
            //Se obtiene el listado de animales y se gestiona el evento de cambio de página.
            if ((DataTable)(Session["DsAnimal"]) != null)
            {
                DataTable dtTabla = (DataTable)(Session["DsClientes"]);
                gvClientes.PageIndex = e.NewPageIndex;
                gvClientes.DataSource = ((DataTable)Session["DsClientes"]).DefaultView;

                //Si el listado de animales se había ordenado por alguna de las columnas se mantiene el mismo orden para cada página.
                if (Session["sortDirection"] != null)
                {
                    DataView dataView = new DataView(dtTabla);
                    if (Session["sortDirection"].ToString().Equals(SortDirection.Ascending.ToString()))
                        dataView.Sort = Session["sortExpression"] + " " + ConvertSortDirectionToSql(SortDirection.Ascending);
                    else
                        dataView.Sort = Session["sortExpression"] + " " + ConvertSortDirectionToSql(SortDirection.Descending);

                    gvClientes.DataSource = dataView;
                }
                gvClientes.DataBind();
            }
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
            lblMensaje.CssClass = "mensajeError";
            throw;
        }
    }
    #endregion

    #region Evento para ordenar clientes
    private string ConvertSortDirectionToSql(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;
        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;
            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }
        return newSortDirection;
    }

    protected void gvClientes_Sorting(object sender, GridViewSortEventArgs e)
    {
        try
        {
            DataTable dataTable = (DataTable)(Session["DsClientes"]);

            //Se controla la direccion de las columnas, si se selecciona la misma columna dos veces se cambia de direccion 
            //ya sea ascendente o descendente
            if (Session["sortExpression"] != null && Session["sortExpression"].ToString() == e.SortExpression.ToString())
            {
                if (Session["sortDirection"].ToString().Equals(SortDirection.Ascending.ToString()))
                    e.SortDirection = SortDirection.Descending;
            }
            if (dataTable != null)
            {
                DataView dataView = new DataView(dataTable);
                dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
                gvClientes.DataSource = dataView;
                gvClientes.DataBind();
                Session["sortExpression"] = e.SortExpression;
                Session["sortDirection"] = e.SortDirection;
            }
        }
        catch
        {
            throw;
        }
    }
    #endregion

    #region Evento para seleccionar un cliente
    protected void gvClientes_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        try
        {
            lblMensaje.Visible = false;
            GridViewRow gvrFilaSeleccionada = gvClientes.Rows[e.NewSelectedIndex];
            txtIdentificacionID.Text = Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.IdentificacionID].Text.Trim());
            ddlTipoIdentificacion.SelectedValue = Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Tipo_de_identificacion].Text.Trim());
            txtNombre.Text = Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Nombre_o_razon_social].Text.Trim().Replace("&nbsp;", ""));
            txtApellidos.Text = Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Apellidos].Text.Trim().Replace("&nbsp;", ""));
            txtTelHab.Text = Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Telefono_habitacion].Text.Trim().Replace("&nbsp;", ""));
            txtTelCel.Text = Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Telefono_celular].Text.Trim().Replace("&nbsp;", ""));
            txtEmail.Text = Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Email].Text.Trim().Replace("&nbsp;", ""));
            txtlDireccion.Text = Convert.ToString(gvrFilaSeleccionada.Cells[(int)Columnas.Direccion].Text.Trim().Replace("&nbsp;", ""));
            txtIdentificacionID.Enabled = false;
            ddlTipoIdentificacion.Enabled = false;
        }
        catch (Exception oEx)
        {
            lblMensaje.Visible = true;
            lblMensaje.Text = oEx.Message;
        }
    }
    #endregion

    /*protected void ddlTipoIdentificacion_SelectedIndexChanged(object sender, EventArgs e)
    {
        if ( ddlTipoIdentificacion.SelectedValue.Equals("F") ) {
            revIdentificacionID.ValidationExpression = "[0-9]-[0-9]{4}-[0-9]{4}";
            revIdentificacionID.ErrorMessage = "La identificación debe seguir el formato #-####-####";
            //txtlDireccion.Text = "F";
        }
        else
        {
            revIdentificacionID.ValidationExpression = "3-[0-9]{3}-[0-9]{6}";
            revIdentificacionID.ErrorMessage = "La identificación debe seguir el formato #-###-######";
            //txtlDireccion.Text = "J";
        }
    }*/
}